from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response

from PAA_ERP.apps.erp_system.serializer.permission_serialzer import PermissionsSerialzer
from PAA_ERP.utils.base_views import MultipleDestroyMixin
from erp_system.models import PermissionsModel, RolesModel
import logging

logger = logging.getLogger('erp')


class PermissionsView(viewsets.ModelViewSet, MultipleDestroyMixin):
    """
    create:
    权限--新增

    权限新增, status: 201(成功), return: 新增权限信息

    destroy:
    权限--删除

    单个权限删除, status: 204(成功), return: None

    multiple_delete:
    权限--批量删除

    多个权限批量删除, status: 204(成功), return: None

    update:
    权限--修改,权限本身的信息

    权限修改, status: 200(成功), return: 修改后的角色信息

    partial_update:
    权限--局部修改(角色批量授权),只能真的某一个角色一次性授权，之前的的授权会被覆盖

    角色批量授权, status: 200(成功), return: 修改后的角色信息

    set_permission_to_role:
    权限--单个授权，一次只能授予角色一个permission，也可以取消一个permission

    status: 200(成功), return: 修改后的角色信息

    list:
    权限--获取所有权限,

    status: 200(成功), return: 角色信息列表

    find_permissions_by_menu:
    查询属于指定菜单或者接口的权限列表，需要传参：menu_id.比如/find_permissions_by_menu/menu_id

    返回权限列表，status：200（成功），return：返回权限列表

    find_permissions:
    返回当前角色的所有已经拥有的权限id列表，以及，erp系统中所有权限（树形）数据结构，必传参数rid


    """
    queryset = PermissionsModel.objects.all()
    serializer_class = PermissionsSerialzer

    @action(methods=['get'], detail=False)
    def find_permissions_by_menu(self, request, *args, **kwargs):
        menu_id = request.query_params.get('menu_id')
        permissions_list = PermissionsModel.objects.filter(menu__id=menu_id).all()
        # 序列化
        ser = PermissionsSerialzer(instance=permissions_list, many=True)
        return Response(ser.data)

    @action(methods=['get'], detail=False)
    def find_permissions(self, request, *args, **kwargs):
        result = {}  # 返回的整个字典数据
        rid = request.query_params.get('rid', None)
        if rid:  # 查询当前角色的所有已经授权的ID
            ids = RolesModel.objects.filter(id=rid).values_list('permissions', flat=True).distinct()
            result['ids'] = ids  # 存入返回字典中 # 整个ERP系统中，所有权限列表，而且要树形展示
        permissions_list = PermissionsModel.objects.values('id', 'name', 'menu__parent__id', 'menu__name',
                                                                'menu__id')
        tree_dict = {}  # 一个父节点权限（里面是树形嵌套）
        tree_data = []  # 所有权限
        # 第一步构建一颗二级树
        for item in permissions_list:
            tree_dict[item['menu__id']] = item
        for i in tree_dict:
            if tree_dict[i]['menu__parent__id']:  # 表示子权限
                pid = tree_dict[i]['menu__parent__id']
                parent = tree_dict[pid]
                child = dict()  # 创建一个空字典(二级)，第二级只要：menu__id, menu__name, permissions(权限列表)
                child['menu__id'] = tree_dict[i]['menu__id']
                child['menu__name'] = tree_dict[i]['menu__name']
                child.setdefault('permissions', [])
                parent.setdefault('children', []).append(child)
            else:
                tree_data.append(tree_dict[i])
        # 第二步：在前面二级树形结构的基础上，添加子权限。得到三级树
        for parent in tree_data:
            if 'children' in parent:
                for child in parent['children']:
                    for node in permissions_list:
                        if node['menu__parent__id'] and node['menu__id'] == child['menu__id']:
                            child['permissions'].append(node)
        logger.info(tree_data)
        result['tree_data'] = tree_data  # 把三级树结构，加入到结果中
        return Response(result)
